package sistkaraoke.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import sistkaraoke.excepcion.DAOExcepcion;
import sistkaraoke.modelo.*;
import sistkaraoke.util.ConexionBD;
import sistkaraoke.dao.BaseDAO;

public class ComprobanteDAO extends BaseDAO implements IComprobanteDAO {
	
	private Connection con = null;
	private CallableStatement cstmt = null;
	private String tipoComprobante;
	private int idComprobante = 0;
	private ResultSet rs = null;
	String query = "";
	
	public int insertarBoleta(IBoleta boleta) throws DAOExcepcion {
			
		tipoComprobante = "B";
		query = "{call KARAOKE.USP_ADD_COMPROBANTE (?,?,?,?,?,?)}";
		int i = 0;
		
		try {
			con = ConexionBD.obtenerConexion();			
			con.setAutoCommit(false);
			
			cstmt = con.prepareCall(query);
	        cstmt.registerOutParameter("idComprobante", java.sql.Types.INTEGER);
	        cstmt.setString("pc_tipoComprobante", tipoComprobante);
	        cstmt.setDouble("pd_monto", boleta.getMonto());
	        cstmt.setInt("pi_idcajero", boleta.getCajero().getId());
	        cstmt.setInt("pi_idCliente", boleta.getCliente().getIdcliente());
	        cstmt.setString("pv_numero", boleta.getNumeroBoleta());	
	        
	        i = cstmt.executeUpdate();
	        idComprobante = cstmt.getInt("idComprobante");
				        			
			if (i != 1) {
				throw new SQLException("No se pudo insertar la Boleta");				
			}
			
			for (IDetalleComprobante detalle : boleta.getDetComprobantes()) {
				query = "{call KARAOKE.USP_ADD_COMPROBANTE_DETALLE (?,?,?)}";
				
				cstmt = con.prepareCall(query);
				cstmt.setInt("pi_idComprobante", idComprobante);
				cstmt.setInt("pi_idproducto", detalle.getProducto().getIdProducto());
				cstmt.setInt("pi_cantidad", detalle.getCantidad());
				cstmt.execute(); 
								
				int u = cstmt.getUpdateCount();
				if (u == -1) {
					throw new SQLException("No se pudo insertar un registro del detalle de la Boleta");
				}				
			}
			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				throw new DAOExcepcion(e.getMessage());
			}			
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				throw new DAOExcepcion(e.getMessage());
			}
			this.cerrarResultSet(rs);
			this.cerrarCallable(cstmt);
			this.cerrarConexion(con);
		}
		return 1;
	}
	
	public int insertarFactura(IFactura factura) throws DAOExcepcion {
		
		tipoComprobante = "F";
		query = "{call KARAOKE.USP_ADD_COMPROBANTE (?,?,?,?,?,?,?)}";
		int i = 0;
		
		try {
			con = ConexionBD.obtenerConexion();
			con.setAutoCommit(false);
			
			cstmt = con.prepareCall(query);
	        cstmt.registerOutParameter("idComprobante", java.sql.Types.INTEGER);
	        cstmt.setString("pc_tipoComprobante", tipoComprobante);
	        cstmt.setDouble("pd_monto", factura.getMonto());
	        cstmt.setInt("pi_idcajero", factura.getCajero().getId());
	        cstmt.setInt("pi_idCliente", factura.getCliente().getIdcliente());
	        cstmt.setString("pv_numero", factura.getNumeroFactura());
	        cstmt.setString("pv_ruc", factura.getRuc());
	        
	        i = cstmt.executeUpdate();
	        idComprobante = cstmt.getInt("idComprobante");
			
	       if (i != 1) {
				throw new SQLException("No se pudo insertar la Factura");				
			}
			
			for (IDetalleComprobante detalle : factura.getDetComprobantes()) {
				query = "{call KARAOKE.USP_ADD_COMPROBANTE_DETALLE (?,?,?)}";
				
				cstmt = con.prepareCall(query);
				cstmt.setInt("pi_idComprobante", idComprobante);
				cstmt.setInt("pi_idproducto", detalle.getProducto().getIdProducto());
				cstmt.setInt("pi_cantidad", detalle.getCantidad());
				cstmt.execute();
								
				int u = cstmt.getUpdateCount();
				if (u == -1) {
					throw new SQLException("No se pudo insertar un registro del detalle de la Factura");
				}				
			}
			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				throw new DAOExcepcion(e.getMessage());
			}			
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				throw new DAOExcepcion(e.getMessage());
			}
			this.cerrarResultSet(rs);
			this.cerrarCallable(cstmt);
			this.cerrarConexion(con);
		}
		return 1;
	}
	
}
